package com.xinchuang.utils;

import org.apache.commons.lang3.StringUtils;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * @Description: BigDecimal操作
 * @Author: thh
 * @Date: 2023/9/28 10:41
 */
public class BigdecimalUtil {

    /**
     * 计算总价2
     *
     * @param price
     * @param count
     * @return
     */
    public static BigDecimal calculateTotalPrice(double price, double count) {
        return BigDecimal.valueOf(price).multiply(BigDecimal.valueOf(count)).setScale(2, RoundingMode.HALF_UP);
    }

    /**
     * double 转 BigDecimal，默认为0
     *
     * @param d
     * @return
     */
    public static BigDecimal double2BigDecimal(Double d) {
        try {
            return new BigDecimal(d + "");
        } catch (Exception e) {
            return new BigDecimal(0);
        }
    }

    /**
     * double 转 BigDecimal，默认为0，保留整数
     *
     * @param d
     * @return
     */
    public static BigDecimal double2BigDecimal0Decimal(Double d) {
        BigDecimal bigDecimal = double2BigDecimal(d);
        return bigDecimal.setScale(0, RoundingMode.HALF_UP);
    }

    /**
     * double 转 BigDecimal，默认为0，保留两位小数
     *
     * @param d
     * @return
     */
    public static BigDecimal double2BigDecimal2Decimal(Double d) {
        BigDecimal bigDecimal = double2BigDecimal(d);
        return bigDecimal.setScale(2, RoundingMode.HALF_UP);
    }

    /**
     * double 转 BigDecimal，默认为0，保留三位小数
     *
     * @param d
     * @return
     */
    public static BigDecimal double2BigDecimal3Decimal(Double d) {
        BigDecimal bigDecimal = double2BigDecimal(d);
        return bigDecimal.setScale(3, RoundingMode.HALF_UP);
    }

    /**
     * double 转 string
     * 防止出现科学计数法
     * double、float 当整数部分超过7位以上（不含7位），就会自动转为科学计数法显示。
     *
     * @param d
     * @return
     */
    public static String double2IntegerString(Double d) {
        BigDecimal bigDecimal = double2BigDecimal(d);
        BigDecimal result = bigDecimal.setScale(0, RoundingMode.HALF_UP);
        return result.toPlainString();
    }

    /**
     * double 转 string
     * 防止出现科学计数法
     * double、float 当整数部分超过7位以上（不含7位），就会自动转为科学计数法显示。
     *
     * @param d
     * @return
     */
    public static String doubleTo1DecimalString(Double d) {
        BigDecimal bigDecimal = double2BigDecimal(d);
        BigDecimal result = bigDecimal.setScale(1, RoundingMode.HALF_UP);
        return result.toPlainString();
    }

    /**
     * double 转 string
     * 防止出现科学计数法
     * double、float 当整数部分超过7位以上（不含7位），就会自动转为科学计数法显示。
     *
     * @param d
     * @return
     */
    public static String doubleTo2DecimalString(Double d) {
        BigDecimal bigDecimal = double2BigDecimal(d);
        BigDecimal result = bigDecimal.setScale(2, RoundingMode.HALF_UP);
        return result.toPlainString();
    }

    /**
     * double 转 string
     * 防止出现科学计数法
     * double、float 当整数部分超过7位以上（不含7位），就会自动转为科学计数法显示。
     *
     * @param d
     * @return
     */
    public static String doubleTo3DecimalString(Double d) {
        BigDecimal bigDecimal = double2BigDecimal(d);
        BigDecimal result = bigDecimal.setScale(3, RoundingMode.HALF_UP);
        return result.toPlainString();
    }

    /**
     * double 转 string
     * 防止出现科学计数法
     * double、float 当整数部分超过7位以上（不含7位），就会自动转为科学计数法显示。
     *
     * @param d
     * @return
     */
    public static String doubleTo4DecimalString(Double d) {
        BigDecimal bigDecimal = double2BigDecimal(d);
        BigDecimal result = bigDecimal.setScale(4, RoundingMode.HALF_UP);
        return result.toPlainString();
    }

    /**
     * double 转 string
     * 防止出现科学计数法
     * double、float 当整数部分超过7位以上（不含7位），就会自动转为科学计数法显示。
     *
     * @param d
     * @return
     */
    public static String doubleTo7DecimalString(Double d) {
        BigDecimal bigDecimal = double2BigDecimal(d);
        BigDecimal result = bigDecimal.setScale(7, RoundingMode.HALF_UP);
        return result.toPlainString();
    }

    /**
     * String 转 BigDecimal，默认为0
     *
     * @param s
     * @return
     */
    public static BigDecimal stringToBigDecimal(String s) {
        try {
            if (StringUtils.isNotBlank(s)) {
                return new BigDecimal(s);
            }else{
                return new BigDecimal(0);
            }
        } catch (Exception e) {
            return new BigDecimal(0);
        }
    }

    /**
     * 保留整数
     *
     * @param s
     * @return
     */
    public static String stringToIntegerString(String s) {
        BigDecimal bigDecimal = stringToBigDecimal(s);
        return bigDecimal.setScale(0, RoundingMode.HALF_UP).toPlainString();
    }

    /**
     * 保留1位小数
     *
     * @param s
     * @return
     */
    public static String stringTo1DecimalString(String s) {
        BigDecimal bigDecimal = stringToBigDecimal(s);
        return bigDecimal.setScale(1, RoundingMode.HALF_UP).toPlainString();
    }

    /**
     * 保留两位小数
     *
     * @param s
     * @return
     */
    public static String stringTo2DecimalString(String s) {
        BigDecimal bigDecimal = stringToBigDecimal(s);
        return bigDecimal.setScale(2, RoundingMode.HALF_UP).toPlainString();
    }

    /**
     * 保留三位小数
     *
     * @param s
     * @return
     */
    public static String stringTo3DecimalString(String s) {
        BigDecimal bigDecimal = stringToBigDecimal(s);
        return bigDecimal.setScale(3, RoundingMode.HALF_UP).toPlainString();
    }

    /**
     * 除以10000(转为万)，保留四位小数
     *
     * @param s
     * @return
     */
    public static String stringToWan4DecimalString(String s) {
        BigDecimal bigDecimal = stringToBigDecimal(s);
        return bigDecimal.divide(new BigDecimal("10000"), 4, RoundingMode.HALF_UP).toPlainString();
    }

    /**
     * 乘以10000，保留2位小数
     *
     * @param s
     * @return
     */
    public static String stringWanTo2DecimalString(String s) {
        BigDecimal bigDecimal = stringToBigDecimal(s);
        return bigDecimal.multiply(new BigDecimal("10000")).setScale(2, RoundingMode.HALF_UP).toPlainString();
    }

    /**
     * 乘以10000，保留2位小数
     *
     * @param s
     * @return
     */
    public static double stringWanTo2Decimal(String s) {
        BigDecimal bigDecimal = stringToBigDecimal(s);
        return bigDecimal.multiply(new BigDecimal("10000")).setScale(2, RoundingMode.HALF_UP).doubleValue();
    }

    /**
     * 保留2位小数
     *
     * @param s
     * @return
     */
    public static double stringTo2DecimalDouble(String s) {
        BigDecimal bigDecimal = stringToBigDecimal(s);
        return bigDecimal.setScale(2, RoundingMode.HALF_UP).doubleValue();
    }

    /**
     * 保留两位小数
     *
     * @param bigDecimal
     * @return
     */
    public static String bigDecimalTo2DecimalString(BigDecimal bigDecimal) {
        return bigDecimal.setScale(2, RoundingMode.HALF_UP).toPlainString();
    }

    /**
     * 保留两位小数
     *
     * @param bigDecimal
     * @return
     */
    public static String bigDecimalTo4DecimalString(BigDecimal bigDecimal) {
        return bigDecimal.setScale(4, RoundingMode.HALF_UP).toPlainString();
    }

    /**
     * 保留两位小数
     *
     * @param molecule    分子
     * @param denominator 分组
     * @return
     */
    public static String bigDecimalToDivide(Object molecule, Object denominator) {
        return new BigDecimal(String.valueOf(molecule)).divide(new BigDecimal(String.valueOf(denominator)), RoundingMode.HALF_UP)
                .setScale(2, RoundingMode.HALF_UP).toPlainString() + "%";
    }
}
